package com.andy.infrastructure.aop;

import com.andy.infrastructure.aop.annotation.Transaction;
import com.andy.infrastructure.ioc.annotation.Autowire;
import com.andy.infrastructure.ioc.annotation.Component;
import com.andy.infrastructure.util.TransactionManager;

import java.lang.reflect.Method;

/**
 * 事物aop增强器
 */
@Component
public class TransactionAopEnhancer extends AbstractAopEnhancer {

    //注入事物增强需要用到的事物管理类
    @Autowire
    private TransactionManager transactionManager;

    /**
     * 事物增强实现的增强方法
     * @param target
     * @param method
     * @param args
     * @return
     * @throws Exception
     */
    @Override
    Object doEnhance(Object target, Method method, Object[] args) throws Exception {
        //如果没有事物控制的注解，则直接返回
        Transaction annotation = method.getAnnotation(Transaction.class);
        if(annotation==null) return method.invoke(target,args);

        //如果已经开启了事物，那么我们就使用这个事物，什么事也不用干，最终也不提交(事物传播)，因为外部开启方会提交
        if(transactionManager.isTransactionBegan()) return method.invoke(target,args);

        //如果没有开启事物，那么我们在方法开始的开启事物，在方法结束后提交并关闭事物
        Object result = null;
        try {
            //开启事物
            transactionManager.beginTransaction();

            //执行方法
            result = method.invoke(target,args);

            //提交事物
            transactionManager.commit();
        }catch (Exception e){
            //事物回滚
            transactionManager.rollback();
            throw e;
        }finally {
            //关闭事物
            transactionManager.closeTransaction();
        }
        return result;
    }

    /**
     * 获取这个增强对应的注解
     *
     * @return
     */
    @Override
    Class getAnnotationClass() {
        return Transaction.class;
    }
}
